package com.baomidou.ant.kingdee.service;

import com.baomidou.ant.kingdee.entity.MaterialModel;
import com.baomidou.ant.kingdee.entity.ProductionModel;
import com.baomidou.ant.vo.response.ResponseKingdeeProductionVo;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.kingdee.bos.webapi.entity.QueryParam;
import com.kingdee.bos.webapi.sdk.K3CloudApi;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.BeanUtils;

import java.time.LocalDateTime;
import java.util.*;

import static org.junit.Assert.fail;

/**
 * 金蝶云系统对接集合方法
 */
@Log4j2
public class KingdeeService {
    private  static  final K3CloudApi api=new K3CloudApi();

    /**
     * 查询生产订单
     * @param pinName 按照产品名来从erp找到对应的生产订单
     * @param deptId erp部门组织id
     */
    public static List<ResponseKingdeeProductionVo> QUERY_PRD_MOExecuteDetailRpt(String[] pinName,String deptId) {
        // 表单内码ID
        String formId = "PRD_MO";//生产订单
        //定义结果集
        List<ResponseKingdeeProductionVo> resultList = new ArrayList<>();
        try {
            // 需要查询的字段列表
            LinkedList<String> fieldKeys = new LinkedList<>();
            fieldKeys.add("FID");//单据id
            fieldKeys.add("FMaterialId");//物料编码id
            fieldKeys.add("FBillNo");//工单号
            fieldKeys.add("FSpecification");//产品型号
            fieldKeys.add("Fqty");//计划数量
            fieldKeys.add("FplanStartDate");//计划开始时间
            fieldKeys.add("FPrdOrgId");//部门
            fieldKeys.add("FDate");//单据日期
            // 查询对象
            QueryParam queryParam = new QueryParam();
            queryParam.setFormId(formId);
            queryParam.setFieldKeys(String.join(",", fieldKeys));
            // 排序
            //QueryParam.;
            // 筛选条件列表
            LinkedList<String> queryfilters = new LinkedList<>();
            // 条件筛选
            if(pinName.length>0){
                //有产品才会执行查询
                for(int i=0;i<pinName.length;i++){
                    if(i==0){
                        //第一条加上"("开始
                        queryfilters.add(String.format("(FSpecification = '%s'", pinName[i]));
                    }else if(i==pinName.length-1){
                        //最后一条加上")"结尾
                        queryfilters.add(String.format("FSpecification = '%s')", pinName[i]));
                    }else {
                        //中间的不加括号
                        queryfilters.add(String.format("FSpecification = '%s'", pinName[i]));
                    }
                }
            }else {
                //没有产品，直接返回空的集合回去
                return null;
            }
            //条件拼接
            if(!CollectionUtils.isEmpty(queryfilters)){
                //用or拼接查询语句
                String filterStr = String.join("  or  ", queryfilters);
                //再拼接and查询2022年7月1号之后的数据，7月1号为项目上线时间
                filterStr=filterStr+String.format(" and (FDate >= '%s')", "2022-07-01");
                //生产部门只查询本部门的,信息技术部可以查看所有生产部门的
                if(!Objects.equals(deptId, "0")){
                    filterStr=filterStr+String.format(" and (FprdOrgId = '%s')", deptId);
                }
                //只查询J开头工单
                filterStr=filterStr+" and (fbillNo like 'J%')";
                //查询条件赋予
                queryParam.setFilterString(filterStr);
            }
            //执行查询,以ProductionModel为基准,得到erp单据集合
            List<ProductionModel> queryList = api.executeBillQuery(queryParam, ProductionModel.class);
            int total = queryList.size();
            //结果集赋予---处理erp单据，以合适的形式输出
            for(ProductionModel productionModel:queryList){
                ResponseKingdeeProductionVo vo=new ResponseKingdeeProductionVo();
                BeanUtils.copyProperties(productionModel,vo);
                //转为数字
                vo.setFQty(String.valueOf(Double.valueOf(productionModel.getFQty()).longValue()));
                //去除.0
                vo.setFPrdOrgId(productionModel.getFPrdOrgId().replace(".0",""));
                vo.setFID(productionModel.getFID().replace(".0",""));
                vo.setFMaterialId(productionModel.getFMaterialId().replace(".0",""));
                vo.setTotal(total);
                //结果赋予
                resultList.add(vo);
            }
        } catch (Exception e) {
            log.error("获取金蝶生产订单异常！异常发生时间为:"+ LocalDateTime.now());
            e.printStackTrace();
        }
        //返回结果集
        return resultList;
    }

    /**
     *
     * @return
     */
    public static Object queryMaterial(){
        //表单id
        String formId="ENG_BOM";
        try {
            // 需要查询的字段列表
            LinkedList<String> fieldKeys = new LinkedList<>();
            fieldKeys.add("FCreateOrgId");//单据id
            fieldKeys.add("FMATERIALID");//物料编码id
            //fieldKeys.add("FENTRYID");//工单号
            // 查询对象
            QueryParam queryParam = new QueryParam();
            queryParam.setFormId(formId);
            queryParam.setFieldKeys(String.join(",", fieldKeys));
            return api.executeBillQuery(queryParam, MaterialModel.class);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }



}
